package com.sy.simpleegg.ui.dialog

import android.annotation.SuppressLint
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentTransaction
import androidx.recyclerview.widget.GridLayoutManager
import com.sy.simpleegg.R
import com.sy.simpleegg.adapter.CashGoodAdapter
import com.sy.simpleegg.bean.CashGoodBean
import com.sy.simpleegg.config.Config
import com.sy.simpleegg.databinding.DialogCashPayBinding
import com.sy.simpleegg.ext.countDown
import com.sy.simpleegg.ext.logFile
import com.sy.simpleegg.ext.onClick
import com.sy.simpleegg.room.entity.OrderEntity
import com.sy.simpleegg.util.BigDecimalUtil
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.cancel


class CashPayDialog(
    private val title: String?,
    private val countDownTime: Int,
    private val cashGoods: MutableList<CashGoodBean>,
    private val lastCashOrder: OrderEntity?,
    private var listener: CashPayListener,
): DialogFragment() {

    private lateinit var binding: DialogCashPayBinding

    var timeDownScope: CoroutineScope? = null

    private var currentMoney: String = "0"
    private var currentCoins: String = "0"

    override fun onStart() {
        super.onStart()
//        dialog!!.window!!.setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)

        val width = resources.getDimensionPixelSize(R.dimen.dialog_cash_pay_width)
        val height = resources.getDimensionPixelSize(R.dimen.dialog_cash_pay_width)
//        val marginBottom = resources.getDimensionPixelSize(R.dimen.dialog_good_detail_margin_bottom)

//        dialog!!.window!!.setLayout(width, height + marginBottom)
        dialog!!.window!!.setLayout(width, height)
        dialog!!.window!!.setGravity(Gravity.CENTER)
        dialog!!.setCanceledOnTouchOutside(false)
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?,
    ): View? {
        binding = DialogCashPayBinding.inflate(inflater, container, false)
//        setStyle(STYLE_NO_TITLE, R.style.MyDialog)
//        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT))
//        dialog!!.window!!.setGravity(Gravity.BOTTOM)
        dialog!!.window!!.setBackgroundDrawableResource(R.color.transparent)
//        var wlp = dialog!!.window!!.attributes
//        wlp.gravity = Gravity.BOTTOM
//        wlp.width = WindowManager.LayoutParams.MATCH_PARENT
//        wlp.height = WindowManager.LayoutParams.MATCH_PARENT
//        dialog!!.window!!.attributes = wlp

        return binding.root
    }

    @SuppressLint("SetTextI18n")
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        try {
//            lastCashOrder?.let {
//                currentMoney = it.money
//                currentCoins = it.amount
//            }
            binding.tvCashSymbols.text = Config.CURRENCY_SYMBOLS

            binding.tvCashAmount.text = BigDecimalUtil.getPrice(currentMoney)
            binding.tvCashGetCoin.text = currentCoins

            binding.tvTitle.text = title
            binding.layoutClose.tvDismiss.text = "${countDownTime}S"

            binding.layoutClose.tvClose.onClick {
//                listener.finish(currentMoney, currentCoins)
                dismissAllowingStateLoss()
            }
            binding.btnFinish.onClick {
//                listener.finish(currentMoney, currentCoins)
                dismissAllowingStateLoss()
            }

            binding.rvCashGood.layoutManager = GridLayoutManager(requireContext(), 3)
            binding.rvCashGood.adapter = CashGoodAdapter(requireContext(), cashGoods)
        }catch (e: Exception){
            e.printStackTrace()
            logFile("初始化页面异常：${e.message}")
        }
    }

    override fun showNow(manager: FragmentManager, tag: String?) {
        super.showNow(manager, tag)
        startCountDown(countDownTime)
    }

    override fun show(manager: FragmentManager, tag: String?) {
        super.show(manager, tag)
        startCountDown(countDownTime)
    }

    override fun show(transaction: FragmentTransaction, tag: String?): Int {
        val result = super.show(transaction, tag)
        startCountDown(countDownTime)
        return result
    }

    override fun onDismiss(dialog: DialogInterface) {
        super.onDismiss(dialog)
        listener.finish(currentMoney, currentCoins)
        listener.dismiss()
    }

    /**
     * 刷新数据
     * @param money 金额
     * @param coins 出币数
     */
    fun refreshCashData(money: String, coins: String){
        try {
            currentMoney = money
            currentCoins = coins
            binding.tvCashAmount.text = BigDecimalUtil.getPrice(currentMoney)
            binding.tvCashGetCoin.text = coins
            startCountDown(countDownTime)
        }catch (e: Exception){
            e.printStackTrace()
            logFile("刷新二维码异常：${e.message}")
        }
    }

    @SuppressLint("SetTextI18n")
    private fun startCountDown(timeout: Int){
//        var timeDownScope: CoroutineScope? = null
        timeDownScope?.cancel()

        countDown(
            time = countDownTime,
            start = {
                timeDownScope = it
                logFile("开始倒计时")
            },
            end = {
                logFile("结束倒计时")
            },
            next = {
                binding.layoutClose.tvDismiss.text = "${it}S"
                if (it == 0){
                    dismissAllowingStateLoss()
                }
            })
    }

    interface CashPayListener{
        fun dismiss()

        fun finish(money: String, coins: String)
    }

    fun dpToPx(context: Context, dp: Int): Int {
        val density = context.resources.displayMetrics.density
        return Math.round(dp * density)
    }
}